// src/services/modelEvaluationService.ts
import axios from 'axios';

// 统一的指标类型
export interface ModelMetrics {
  MAE: number;
  RMSE: number;
  R2: number;
  test_days?: number;
  first_date?: string;
  last_date?: string;
  model_used?: string;
}

// 统一的评估响应类型
export interface EvaluationResponse {
  metrics: ModelMetrics;
  model_type: ModelType;
  plot_url: string;
  status: 'success' | 'error';
  message?: string;
}

// 模型类型枚举
export enum ModelType {
  LSTM = 'lstm',
  ENSEMBLE = 'ensemble',
  // 可扩展其他模型类型
}

// 目标类型枚举
export enum TargetType {
  GUILIN_TEMP = 'guilin_temp',  // LSTM支持的目标
  GUILIN_MAX = 'guilin_max',    // 集成学习支持的目标
  GUILIN_MIN = 'guilin_min',    // 集成学习支持的目标
  // 可扩展其他目标类型
}

// 模型评估配置
export interface EvaluationConfig {
  modelType: ModelType;
  target: TargetType;
  testDays?: number; // 仅集成学习需要
  lstmTarget?: string; // LSTM特定参数
}

/**
 * 统一的模型评估API
 * @param config 评估配置
 * @returns 包含评估结果的Promise
 */
export const evaluateModel = async (config: EvaluationConfig): Promise<EvaluationResponse> => {
  try {
    let response;
    
    // 根据模型类型选择不同的API路径
    if (config.modelType === ModelType.LSTM) {
      response = await axios.get(`/evaluate_lstm`, {
        params: { 
          target: config.target,
          lstm_target: config.lstmTarget
        },
        baseURL: 'http://127.0.0.1:5000/api'
      });
    } else {
      // 集成学习模型
      response = await axios.get(`/evaluate_ensemble`, {
        params: {
          target: config.target,
          test_days: config.testDays || 365,
          model_type: 'single'
        },
        baseURL: 'http://127.0.0.1:5000/api'
      });
    }
    
    // 处理返回数据
    const data = response.data;
    
    // 统一处理路径格式
    if (data.plot_url) {
      data.plot_url = data.plot_url.replace(/\\/g, '/');
    }
    
    return data;
  } catch (error: any) {
    console.error(`${config.modelType}模型评估失败:`, error);
    
    // 返回统一的错误响应结构
    return {
      status: 'error',
      message: error.response?.data?.message || `${config.modelType}模型评估请求失败`,
      metrics: {
        MAE: 0,
        RMSE: 0,
        R2: 0
      },
      model_type: config.modelType,
      plot_url: ''
    };
  }
};

/**
 * 批量评估多个模型
 * @param configs 评估配置数组
 * @returns 包含所有评估结果的Promise
 */
export const evaluateMultipleModels = async (configs: EvaluationConfig[]): Promise<EvaluationResponse[]> => {
  const results = await Promise.allSettled(
    configs.map(config => evaluateModel(config))
  );
  
  return results.map(result => 
    result.status === 'fulfilled' 
      ? result.value 
      : {
          status: 'error',
          message: '模型评估失败',
          metrics: { MAE: 0, RMSE: 0, R2: 0 },
          model_type: configs[0]?.modelType || ModelType.LSTM,
          plot_url: ''
        }
  );
};